package com.campus.food.model.entity;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

/**
 * 订单实体类
 * 对应数据库表：t_order
 * 
 * @author Claude3.7 Sonnet
 * @since 2025-05-29
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class Order {
    
    /**
     * 订单ID
     */
    private Long id;
    
    /**
     * 订单编号
     */
    private String orderNo;
    
    /**
     * 用户ID
     */
    private Long userId;
    
    /**
     * 商家ID
     */
    private Long merchantId;
    
    /**
     * 地址ID
     */
    private Long addressId;
    
    /**
     * 订单总价
     */
    private BigDecimal totalPrice;
    
    /**
     * 订单状态：0-待付款，1-待接单，2-备餐中，3-配送中，4-已完成，5-已取消
     */
    private Integer status;

    /**
     *  商家名
     */

    private String merchantName;

    /**
     * 支付方式：1-微信，2-支付宝，3-校园卡
     */
    private Integer paymentMethod;
    
    /**
     * 支付时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime paymentTime;
    
    /**
     * 配送时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime deliveryTime;
    
    /**
     * 完成时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime completeTime;
    
    /**
     * 取消时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime cancelTime;
    
    /**
     * 取消原因
     */
    private String cancelReason;
    
    /**
     * 订单备注
     */
    private String remark;
    
    /**
     * 创建时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    
    /**
     * 更新时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    
    /**
     * 订单详情列表（非数据库字段）
     */
    private List<OrderDetail> orderDetails;
    
    /**
     * 配送地址（非数据库字段，从address表获取）
     */
    private String deliveryAddress;
    
    /**
     * 收货人姓名（非数据库字段，从address表获取）
     */
    private String receiverName;
    
    /**
     * 收货人电话（非数据库字段，从address表获取）
     */
    private String receiverPhone;
    
    /**
     * 实际支付金额（非数据库字段，由业务逻辑计算）
     */
    private BigDecimal actualAmount;
    
    /**
     * 订单状态枚举
     */
    public enum Status {
        PENDING_PAYMENT(0, "待付款"),
        WAITING_ACCEPT(1, "待接单"),
        PREPARING(2, "备餐中"),
        DELIVERING(3, "配送中"),
        COMPLETED(4, "已完成"),
        CANCELLED(5, "已取消");
        
        private final Integer value;
        private final String desc;
        
        Status(Integer value, String desc) {
            this.value = value;
            this.desc = desc;
        }
        
        public Integer getValue() {
            return value;
        }
        
        public String getDesc() {
            return desc;
        }
    }
    
    /**
     * 支付方式枚举
     */
    public enum PaymentMethod {
        WECHAT(1, "微信支付"),
        ALIPAY(2, "支付宝"),
        CAMPUS_CARD(3, "校园卡");
        
        private final Integer value;
        private final String desc;
        
        PaymentMethod(Integer value, String desc) {
            this.value = value;
            this.desc = desc;
        }
        
        public Integer getValue() {
            return value;
        }
        
        public String getDesc() {
            return desc;
        }
    }
} 